package com.binguo.common.util;

import org.springframework.util.StringUtils;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Date;
import java.util.Properties;

/**
 * @author yuritian
 * @Title: SendEmailUtil
 * @ProjectName binguoDevelop
 * @Description: TODO
 * @date 2020/4/2915:05
 */
public class SendEmailUtil {

    private static String HOST = "smtp.exmail.qq.com";

    private static String PROTOCOL = "smtp";

    public static void main(String[] args) {
        SendEmailUtil sendEmailUtil = new SendEmailUtil();
        try {
            sendEmailUtil.sendMimeMessageImg(null,null,"jing.yu@yunpengai.com","8qvsipyuBZ9uECfd",
                    "云澎测试","821738771@qq.com","余敬","云澎邮件发送测试","发送邮件成功");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private Session getSession(String protocol,
                               String host){
        Properties props = new Properties();
        // 使用的协议（JavaMail规范要求）
        props.setProperty("mail.transport.protocol", protocol);
        // 发件人的邮箱的 SMTP 服务器地址
        props.setProperty("mail.smtp.host", host);
        props.setProperty("mail.smtp.auth", "true");
        // 2. 根据配置创建会话对象, 用于和邮件服务器交互
        Session session = Session.getDefaultInstance(props);
        return session;
    }


    /**
     * 创建一封只包含文本的简单邮件
     *
     * @param protocol 传输形式(imap,smtp)
     * @param host 发送服务器地址
     * @param sendMail 发件邮箱账号
     * @param sendMailPwd 发件邮箱客户端专用密码
     * @param sendPersonName 发件邮箱用户名
     * @param receiveMail 收件人邮箱
     * @param receivePersonName 收件人用户名
     * @param receiveMailHead 邮件标题
     * @param receiveMailMsg 邮件文本内容
     * @return
     * @throws Exception
     */
    public void createMimeMessage(String protocol,
                                  String host,
                                  String sendMail,
                                  String sendMailPwd,
                                  String sendPersonName,
                                  String receiveMail,
                                  String receivePersonName,
                                  String receiveMailHead,
                                  String receiveMailMsg) throws Exception {
        if (!StringUtils.hasText(protocol)){
            protocol = PROTOCOL;
        }

        if (!StringUtils.hasText(host)){
            host = HOST;
        }

        Session session = getSession(protocol,host);
        // 1. 创建一封邮件
        MimeMessage message = new MimeMessage(session);

        // 2. From: 发件人（昵称有广告嫌疑，避免被邮件服务器误认为是滥发广告以至返回失败，请修改昵称）
        message.setFrom(new InternetAddress(sendMail, sendPersonName, "UTF-8"));

        // 3. To: 收件人（可以增加多个收件人、抄送、密送）
        message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, receivePersonName, "UTF-8"));

        // 4. Subject: 邮件主题（标题有广告嫌疑，避免被邮件服务器误认为是滥发广告以至返回失败，请修改标题）
        message.setSubject(receiveMailHead, "UTF-8");

        // 5. Content: 邮件正文（可以使用html标签）（内容有广告嫌疑，避免被邮件服务器误认为是滥发广告以至返回失败，请修改发送内容）
        message.setContent(receiveMailMsg, "text/html;charset=UTF-8");

        // 6. 设置发件时间
        message.setSentDate(new Date());

        // 7. 保存设置
        message.saveChanges();

        Transport transport = session.getTransport();

        transport.connect(sendMail, sendMailPwd);

        // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
        transport.sendMessage(message, message.getAllRecipients());

        // 7. 关闭连接
        transport.close();
    }


    public void sendMimeMessageImg(String protocol,
                                  String host,
                                  String sendMail,
                                  String sendMailPwd,
                                  String sendPersonName,
                                  String receiveMail,
                                  String receivePersonName,
                                  String receiveMailHead,
                                  String receiveMailMsg) throws Exception {
        if (!StringUtils.hasText(protocol)){
            protocol = PROTOCOL;
        }

        if (!StringUtils.hasText(host)){
            host = HOST;
        }

        Session session = getSession(protocol,host);

        session.setDebug(true);

        // 1. 创建一封邮件
        MimeMessage message = new MimeMessage(session);

        // 2. From: 发件人（昵称有广告嫌疑，避免被邮件服务器误认为是滥发广告以至返回失败，请修改昵称）
        message.setFrom(new InternetAddress(sendMail, sendPersonName, "UTF-8"));

        // 3. To: 收件人（可以增加多个收件人、抄送、密送）
        message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, receivePersonName, "UTF-8"));

        // 4. Subject: 邮件主题（标题有广告嫌疑，避免被邮件服务器误认为是滥发广告以至返回失败，请修改标题）
        message.setSubject(receiveMailHead, "UTF-8");

        // 5. Content: 邮件正文（可以使用html标签）（内容有广告嫌疑，避免被邮件服务器误认为是滥发广告以至返回失败，请修改发送内容）
        message.setContent(receiveMailMsg, "text/html;charset=UTF-8");

        // 6. 创建文本"节点"
        MimeBodyPart text = new MimeBodyPart();
        // 这里添加图片的方式是将整个图片包含到邮件内容中, 实际上也可以以 http 链接的形式添加网络图片
        text.setContent("这是一张图片<br/><a href='http://binguoai.com:80/wxfaces/88b77837-174f-49a2-aa08-9415004a753c.png'><img src='http://binguoai.com:80/wxfaces/88b77837-174f-49a2-aa08-9415004a753c.png'/></a>", "text/html;charset=UTF-8");

        // 7. （文本+图片）设置 文本 和 图片"节点"的关系（将 文本 和 图片"节点"合成一个混合"节点"）
        MimeMultipart mm_text_image = new MimeMultipart();
        mm_text_image.addBodyPart(text);

        message.setContent(mm_text_image);


        // 6. 设置发件时间
        message.setSentDate(new Date());


        // 7. 保存设置
        message.saveChanges();

        Transport transport = session.getTransport();

        transport.connect(sendMail, sendMailPwd);

        // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
        transport.sendMessage(message, message.getAllRecipients());

        // 7. 关闭连接
        transport.close();
    }
}
